<?php namespace App\Model;

use Illuminate\Database\Eloquent\Model;

class Map extends Model
{
    /**
     * 根据地址获取经纬度
     * @param $data 请求数据
     * @param $type 服务商 1百度 2高德
     * @param $url  接口地址
     * @return bool
     */
    public function getLatLng($data, $type, $url){
        // 参数判断
        if(empty($data) || empty($url) || !in_array($type,['1','2'])){
            return false;
        }
        // GET请求
        $res = self::curlGetRequest($url, $data, 5);
        $res = json_decode($res, true);
        // 高德
        if($res['status'] == '1' && $type == '2'){
            $latlng = explode(',', $res['geocodes'][0]['location']);
            return ['lng'=>$latlng[0],'lat'=>$latlng[1]];
        }
        // 百度
        if($res['status'] == '0' && $type == '1'){
            $lat = (string)$res['result'][0]['location']['lat'];
            $lng = (string)$res['result'][0]['location']['lng'];
            return ['lng'=>$lng,'lat'=>$lat];
        }

        // 其他情况
        return false;
    }

    /**
     * 经纬度获取地址
     * @param $data 请求数据
     * @param $type 服务类型 1百度 2高德
     * @param $url  接口地址
     * @return bool
     */
    public function getAddres($data, $type, $url){
        // 参数判断
        if(empty($data) || empty($url) || !in_array($type, ['1','2'])){
            return false;
        }
        // GET请求
        $res = self::curlGetRequest($url, $data, 5);
        $res = json_decode($res, true);
        // 高德
        if($res['status'] == '1' && $type == '2'){
            return ['addres'=>$res['regeocode']['formatted_address']];
        }
        // 百度
        if($res['status'] == '0' && $type == '1'){
            return ['addres'=>$res['formatted_address']];
        }
        // 其他情况
        return false;
    }

    /**
     * 坐标系转换方法
     * @param $data 请求数据
     * @param $type 服务类型 1百度 2高德
     * @param $url  接口地址
     * @return array|bool
     */
    public function getCoordinate($data, $type, $url){
        // 参数判断
        if(empty($data) || empty($type) || empty($url)){
            return false;
        }
        // GET请求
        $res = self::curlGetRequest($url, $data, 5);
        $res = json_decode($res, true);

        // 高德
        if($res['status'] == '1' && $type == '2'){
            $cood = explode(',',$res['locations']);
            return ['lng'=>$cood[0],'lat'=>$cood[1]];
        }
        // 百度
        if($res['status'] == '0' && $type == '1'){
            $cood = $res['result'][0];
            return ['lng'=>(string)$cood['x'],'lat'=>(string)$cood['y']];
        }
        // 其他情况
        return false;
    }

    /**
     * 坐标系转换方法
     * @param $data 请求数据
     * @param $type 服务类型 1百度 2高德
     * @param $url  接口地址
     * @return array|bool
     */
    public function getCityByIP($data, $type, $url){
        // 参数判断
        if(empty($data) || empty($type) || empty($url)){
            return false;
        }
        // GET请求
        $res = self::curlGetRequest($url, $data, 5);
        $res = json_decode($res, true);

        // 高德
        if($res['status'] == '1' && $type == '2'){
            // 数据处理
            $data = [];
            $data['city']     = $res['city'];
            $data['province'] = $res['province'];
            $data['point']    = $res['rectangle'];
            unset($res);
            return $data;
        }
        // 百度
        if($res['status'] == '0' && $type == '1'){
            // 数据处理
            $data = [];
            $data['city']     = $res['content']['address_detail']['city'];
            $data['province'] = $res['content']['address_detail']['province'];
            $data['point']    = implode(',', $res['content']['point']);
            unset($res);
            return $data;
        }
        // 其他情况
        return false;
    }

    /**
     * 封装curl的调用接口，POST的请求方式。
     * @param $url
     * @param $data
     * @param int $timeout
     * @return bool|mixed
     */
    public static function curlPostRequest($url, $data, $timeout = 5){
        // 参数判断
        if(empty($url) || empty($data) || $timeout <=0){
            return false;
        }

        $ch = curl_init();//初始化curl
        curl_setopt($ch,CURLOPT_URL,$url);          //指定地址
        curl_setopt($ch, CURLOPT_HEADER, 0);        //设置header
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_POST, 1);          //post提交方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//绑定数据
        curl_setopt($ch, CURLOPT_TIMEOUT, (int)$timeout);
        $res = curl_exec($ch);                      //运行curl
        curl_close($ch);
        // 返回数据
        return $res;
    }

    /**
     * 封装curl的调用接口，GET的请求方式。
     * @param $url
     * @param $data
     * @param int $timeout
     * @return bool|mixed
     */
    public static function curlGetRequest($url, $data, $timeout = 5){
        // 参数判断
        if(empty($url) || $timeout <= 0 || empty($data)){
            return false;
        }
        // 组合URL
        $url .= '?' . http_build_query($data);
        // 初始化
        $con = curl_init();
        // 设置选项，包括URL
        curl_setopt($con, CURLOPT_URL,urldecode($url));
        curl_setopt($con, CURLOPT_HEADER, false);
        curl_setopt($con, CURLOPT_RETURNTRANSFER,true);
        curl_setopt($con, CURLOPT_TIMEOUT, (int)$timeout);
        // 执行并获取信息
        $res = curl_exec($con);
        // 释放curl句柄
        curl_close($con);
        // 返回数据
        return $res;
    }

    /**
     * 获取地图API接口
     * @param $type 1百度地址转经纬度 2高德地址转经纬度 3百度经纬度转地址 4高德经纬度转地址 5百度坐标系转换 6高德IP定位 7高德坐标系转化 8百度IP定位
     */
    public static function getBaseUrl($type){
        switch ($type){
            case '1' :
                // 百度地址转经纬度
                $apiUrl = 'http://api.map.baidu.com/cloudgc/v1';
                break;
            case '2' :
                // 高德地址转经纬度
                $apiUrl = 'http://restapi.amap.com/v3/geocode/geo';
                break;
            case '3' :
                // 百度经纬度转地址
                $apiUrl = 'http://api.map.baidu.com/cloudrgc/v1';
                break;
            case '4' :
                // 高德经纬度转地址
                $apiUrl = 'http://restapi.amap.com/v3/geocode/regeo';
                break;
            case '5' :
                // 百度坐标系转换接口
                $apiUrl = 'http://api.map.baidu.com/geoconv/v1/';
                break;
            case '6' :
                // 高德IP定位
                $apiUrl = 'http://restapi.amap.com/v3/ip';
                break;
            case '7' :
                // 高德经纬度转换
                $apiUrl = 'http://restapi.amap.com/v3/assistant/coordinate/convert';
                break;
            case '8' :
                // 百度IP定位
                $apiUrl = 'http://api.map.baidu.com/location/ip';
                break;
            default :
                // 默认
                $apiUrl = '';
                break;
        }
        return $apiUrl;
    }
}